"""
环境变量工具模块。
EN: Environment variable utility module.

该模块提供了一系列函数，用于获取和判断当前运行环境的各种配置，
例如是否为线上/开发环境、存储介质类型、GPU 类型、是否开启虚拟化等。
EN: This module provides a series of functions for retrieving and determining various configurations
of the current running environment, such as whether it's a production/development environment,
storage media type, GPU type, whether virtualization is enabled, etc.
"""

# 导入 json 模块，用于处理 JSON 数据
# EN: Import the json module, used for handling JSON data
import json
# 导入 os 模块，用于与操作系统进行交互，主要用于获取环境变量
# EN: Import the os module, used for interacting with the operating system, mainly for getting environment variables
import os


def is_online() -> bool:
    """
    判断当前环境是否是线上（生产）环境。
    EN: Determines if the current environment is a production environment.

    通过检查环境变量 'STAGE' 的值是否为 'prod' 来判断。
    EN: Determined by checking if the value of the environment variable 'STAGE' is 'prod'.

    Returns:
        bool: 如果是线上环境返回 True，否则返回 False。
        EN: bool: Returns True if it is a production environment, False otherwise.
    """
    return os.environ.get('STAGE') == 'prod'


def is_dev() -> bool:
    """
    判断当前环境是否是开发环境。
    EN: Determines if the current environment is a development environment.

    通过检查环境变量 'STAGE' 的值是否为 'dev' 来判断。
    EN: Determined by checking if the value of the environment variable 'STAGE' is 'dev'.

    Returns:
        bool: 如果是开发环境返回 True，否则返回 False。
        EN: bool: Returns True if it is a development environment, False otherwise.
    """
    return os.environ.get('STAGE') == 'dev'


def get_env() -> str or None:
    """
    获取当前环境的标识符。
    EN: Retrieves the identifier for the current environment.

    通过获取环境变量 'STAGE' 的值来获取。
    EN: Retrieved by getting the value of the environment variable 'STAGE'.

    Returns:
        str or None: 当前环境的字符串标识符，如果未设置则返回 None。
        EN: str or None: The string identifier for the current environment, or None if not set.
    """
    return os.environ.get('STAGE')


def is_private() -> bool:
    """
    判断当前环境是否是私有环境。
    EN: Determines if the current environment is a private environment.

    私有环境被定义为非 ModelArts 环境。
    EN: A private environment is defined as a non-ModelArts environment.

    Returns:
        bool: 如果是私有环境返回 True，否则返回 False。
        EN: bool: Returns True if it is a private environment, False otherwise.
    """
    return not is_modelarts()


# 判断当前环境是不是 ModelArts 环境
# EN: Determines if the current environment is a ModelArts environment
def is_modelarts() -> bool:
    """
    判断当前环境是否是华为云 ModelArts 环境。
    EN: Determines if the current environment is a Huawei Cloud ModelArts environment.

    通过检查环境变量 'STORAGE_MEDIA' 的值是否为 'OBS' 来判断。
    EN: Determined by checking if the value of the environment variable 'STORAGE_MEDIA' is 'OBS'.

    Returns:
        bool: 如果是 ModelArts 环境返回 True，否则返回 False。
        EN: bool: Returns True if it is a ModelArts environment, False otherwise.
    """
    return os.getenv('STORAGE_MEDIA') == 'OBS'


def is_alluxio() -> bool:
    """
    判断当前环境是否使用 Alluxio 存储。
    EN: Determines if the current environment uses Alluxio storage.

    通过检查环境变量 'STORAGE_MEDIA' 的值是否为 'MINIO' 来判断。
    EN: Determined by checking if the value of the environment variable 'STORAGE_MEDIA' is 'MINIO'.

    Returns:
        bool: 如果使用 Alluxio 存储返回 True，否则返回 False。
        EN: bool: Returns True if Alluxio storage is used, False otherwise.
    """
    return os.getenv('STORAGE_MEDIA') == 'MINIO'


def is_juicefs() -> bool:
    """
    判断当前环境是否使用 JuiceFS 存储。
    EN: Determines if the current environment uses JuiceFS storage.

    通过检查环境变量 'S3_ENDPOINT' 的值中是否包含 'juicefs' 来判断。
    EN: Determined by checking if the value of the environment variable 'S3_ENDPOINT' contains 'juicefs'.

    Returns:
        bool: 如果使用 JuiceFS 存储返回 True，否则返回 False。
        EN: bool: Returns True if JuiceFS storage is used, False otherwise.
    """
    return 'juicefs' in os.getenv('S3_ENDPOINT', '')


def is_arm() -> bool:
    """
    判断当前环境是否是 ARM 架构。
    EN: Determines if the current environment is ARM architecture.

    通过检查环境变量 'STORAGE_MEDIA' 的值是否为 'ARM' 或 'arm' 来判断。
    EN: Determined by checking if the value of the environment variable 'STORAGE_MEDIA' is 'ARM' or 'arm'.

    Returns:
        bool: 如果是 ARM 架构返回 True，否则返回 False。
        EN: bool: Returns True if it is ARM architecture, False otherwise.
    """
    return os.getenv('STORAGE_MEDIA') == 'ARM' or os.getenv('STORAGE_MEDIA') == 'arm'


def get_gpu_type() -> str or None:
    """
    获取当前环境的 GPU 类型。
    EN: Retrieves the GPU type of the current environment.

    通过获取环境变量 'GPU_TYPE' 的值来获取。
    EN: Retrieved by getting the value of the environment variable 'GPU_TYPE'.

    Returns:
        str or None: 当前环境的 GPU 类型字符串，如果未设置则返回 None。
        EN: str or None: The GPU type string for the current environment, or None if not set.
    """
    return os.getenv('GPU_TYPE')


def is_ascend910() -> bool:
    """
    判断当前环境是否是昇腾 910 (Ascend 910) 环境。
    EN: Determines if the current environment is an Ascend 910 environment.

    如果当前是 ModelArts 环境，则认为是昇腾环境。否则，通过检查环境变量 'GPU_TYPE' 的值是否为 'Ascend' 来判断。
    EN: If the current environment is ModelArts, it is considered an Ascend environment. Otherwise,
    it is determined by checking if the value of the environment variable 'GPU_TYPE' is 'Ascend'.

    Returns:
        bool: 如果是昇腾 910 环境返回 True，否则返回 False。
        EN: bool: Returns True if it is an Ascend 910 environment, False otherwise.
    """
    if is_modelarts():
        return True
    return os.getenv('GPU_TYPE') == 'Ascend'


def get_region_id() -> str or None:
    """
    获取 ModelArts 配置中的区域 ID。
    EN: Retrieves the region ID from ModelArts configurations.

    通过解析环境变量 'MODELARTS_CFGS' 中的 JSON 字符串来获取 'region_id' 字段。
    EN: Retrieved by parsing the JSON string in the environment variable 'MODELARTS_CFGS' for the 'region_id' field.

    Returns:
        str or None: 区域 ID 字符串，如果未找到则返回 None。
        EN: str or None: The region ID string, or None if not found.
    """
    # 获取 MODELARTS_CFGS 环境变量，如果不存在则默认为空 JSON 字符串
    # EN: Get the MODELARTS_CFGS environment variable, default to an empty JSON string if not present
    modelarts_config_str = os.getenv('MODELARTS_CFGS', '{}') or '{}'
    # 将 JSON 字符串解析为 Python 字典
    # EN: Parse the JSON string into a Python dictionary
    modelarts_config = json.loads(modelarts_config_str)
    # 返回 'region_id' 字段的值
    # EN: Return the value of the 'region_id' field
    return modelarts_config.get('region_id')


def get_external_domain_name() -> str or None:
    """
    获取 ModelArts 配置中的外部域名。
    EN: Retrieves the external domain name from ModelArts configurations.

    通过解析环境变量 'MODELARTS_CFGS' 中的 JSON 字符串来获取 'external_domain_name' 字段。
    EN: Retrieved by parsing the JSON string in the environment variable 'MODELARTS_CFGS' for the 'external_domain_name' field.

    Returns:
        str or None: 外部域名字符串，如果未找到则返回 None。
        EN: str or None: The external domain name string, or None if not found.
    """
    # 获取 MODELARTS_CFGS 环境变量，如果不存在则默认为空 JSON 字符串
    # EN: Get the MODELARTS_CFGS environment variable, default to an empty JSON string if not present
    modelarts_config_str = os.getenv('MODELARTS_CFGS', '{}') or '{}'
    # 将 JSON 字符串解析为 Python 字典
    # EN: Parse the JSON string into a Python dictionary
    modelarts_config = json.loads(modelarts_config_str)
    # 返回 'external_domain_name' 字段的值
    # EN: Return the value of the 'external_domain_name' field
    return modelarts_config.get('external_domain_name')


def is_vgpu() -> bool:
    """
    判断是否开启了 GPU 虚拟化 (VGPU)。
    EN: Determines if GPU virtualization (VGPU) is enabled.

    通过检查环境变量 'VGPU_ON' 的值是否为 'true' 来判断。
    EN: Determined by checking if the value of the environment variable 'VGPU_ON' is 'true'.

    Returns:
        bool: 如果开启了 VGPU 返回 True，否则返回 False。
        EN: bool: Returns True if VGPU is enabled, False otherwise.
    """
    return os.getenv('VGPU_ON', 'false') == 'true'


def is_volcano_binpack() -> bool:
    """
    判断是否开启了 Volcano Binpack 调度。
    EN: Determines if Volcano Binpack scheduling is enabled.

    通过检查环境变量 'VOLCANO_BINPACK' 的值是否为 'true' 来判断。
    EN: Determined by checking if the value of the environment variable 'VOLCANO_BINPACK' is 'true'.

    Returns:
        bool: 如果开启了 Volcano Binpack 调度返回 True，否则返回 False。
        EN: bool: Returns True if Volcano Binpack scheduling is enabled, False otherwise.
    """
    return os.getenv('VOLCANO_BINPACK', 'false') == 'true'


def get_service_external_ip() -> str or None:
    """
    获取 Kubernetes (k8s) 服务的对外 IP 地址。
    EN: Retrieves the external IP address of the Kubernetes (k8s) service.

    通过获取环境变量 'SERVICE_EXTERNAL_IP' 的值来获取。
    EN: Retrieved by getting the value of the environment variable 'SERVICE_EXTERNAL_IP'.

    Returns:
        str or None: 服务的外部 IP 地址字符串，如果未设置或为空则返回 None。
        EN: str or None: The external IP address string of the service, or None if not set or empty.
    """
    # 获取 SERVICE_EXTERNAL_IP 环境变量
    # EN: Get the SERVICE_EXTERNAL_IP environment variable
    ip_str = os.getenv('SERVICE_EXTERNAL_IP', None)
    # 如果 IP 字符串为 None，直接返回 None
    # EN: If the IP string is None, return None directly
    if ip_str is None:
        return None
    # 移除字符串两端的空白字符
    # EN: Remove whitespace from both ends of the string
    ip_str = ip_str.strip()
    # 如果处理后的字符串长度为 0，返回 None
    # EN: If the processed string length is 0, return None
    if len(ip_str) == 0:
        return None
    # 返回处理后的 IP 字符串
    # EN: Return the processed IP string
    return ip_str


# 判断是否开启 GPU 虚拟化 (VGPU) 的布尔值，在模块加载时计算
# EN: Boolean value indicating if GPU virtualization (VGPU) is enabled, calculated at module load time
IS_VGPU = is_vgpu()
# 判断是否开启 Volcano Binpack 调度的布尔值，在模块加载时计算
# EN: Boolean value indicating if Volcano Binpack scheduling is enabled, calculated at module load time
IS_VOLCANO_BINPACK = is_volcano_binpack()
